<?php 

class Event_CallCenterPreSave extends Crud_Event_Handler 
{
	protected $_type = 'preSave';
	
	/**
	 * Run handler with options array.
	 * 
	 * @param OrdersRow $row
	 * @return void
	 */
	public function run($row)
	{
		if ($row instanceof Crud_Section_Row) {
			$row = $row->getRow();
		}
	
		$service = OrderStatusPeer::getInstance();
		$uncall = $service->getStatusByKey('uncall');
		$placed = $service->getStatusByKey(OrdersService::STATUS_ORDER_PLACED);
		$unverified = $service->getStatusByKey(OrdersService::STATUS_ORDER_UNVERIFIED);

		if($this->_getParam('executed_at') == '00.00.0000'){
			throw new Crud_Exception('Вы не заполнили поле дата доставки');
		}
		
		if($this->_getParam('wikimart') && !$this->_getParam('type_id')){
			throw new Crud_Exception('Вы не указали источник заказа');
		}
		
		if ($this->_getParam('cancel') && !$row->isCanceled()) {
			$row->addLog("%s отменил заказ");
			$this->_cancel($row);
		}else if ($this->_getParam('submit') && ($row->isModifiedAvailable() || $row->getOrderStatusId() == $unverified->getId())) {
			$this->_check_balances($row);
			//if($row->getTotalCost() == 0){
				$this->_summDelivery($row);
			//}
			$status = $service->getStatusByKey(OrdersService::STATUS_ORDER_APPROVED);
			$row->setOrderStatusId($status->getId());
			$row->addLog("%s подтвердил заказ");
			$row->setAcceptedAt(date('Y-m-d H:i:s'));
		} else if ($this->_getParam('change') && $row->isModifiedAvailable()) {
			if (!$row->getOrderStatusId()) {
				$row->setOrderStatusId($placed->getId());
			}
			if($row->getTotalCost() == 0 && $row->getId()){
				$this->_summDelivery($row);
			}
		} else if ($this->_getParam('copy')) {
			// nothing
		}else if ($this->_getParam('canceled_copy')) {
			// nothing
		} else {
			throw new Crud_Exception('Вы пытаетесь совершить неизвестное действие');
		}
		
		if ($row->getOrderStatusId() == $uncall->getId()) {
			$row->setOrderStatusId($placed->getId());
			$row->addLog("%s изменил заказ. Статус 'Не дозвонились' автоматически сменен на 'Размещен'");
		}		
		if ($row->getId()) {
			$this->_logChangedColumns($row);
		}
	}

	public function _summDelivery($row) {
		$edit = $this->_getParam('product_callcenter_count_edit', array());
		$peer = Order2productPeer::getInstance();
		$ids = 0;
		$summa_orders = 0;
		$dis4prods = CouponService::getInstance()->getProductsDiscountByDb($row);
		foreach($edit as $id=>$count){
			$ids = $id;
			$select = $peer->select()
					->where('`order_id` = ?', $row->getId())
					->where('`product_id` = ?', $ids);
			$result = $peer->fetchRow($select);
			$sum_prod = $result['price'] * $result['count'];
			$summa_orders = $summa_orders + $sum_prod;
			if (isset($dis4prods[$id])){
				$summa_orders -= $dis4prods[$id] * $result['price'] * $result['count'] / 100;
			}
		}

		$row->setTotalCost($summa_orders);
		$row->save();
	}

	public function _check_balances($row)
	{
		$edit = $this->_getParam('product_callcenter_count_edit', array());
		$peer = Order2productPeer::getInstance();


		foreach ($edit as $id => $count) {
			$select = $peer->select();
			$select->where(Order2productPeer::PRODUCT_ID, $id);
			$select->where(Order2productPeer::ORDER_ID, $row->getId());
			$o2p = $peer->fetchRow($select);

			$product = $o2p->getProductRowByProductId();
			$neededCount = $count - $o2p->getCount();

			if ($count == 0) {
				throw new Crud_Exception("{$product->getName()} невозможно оформить , с нулевым остатком (Остаток у этого товара на складе) {$o2p->getCount()}");
			}

			if ($product->getCount() < $neededCount) {
				throw new Crud_Exception("{$product->getName()} невозможно оформить {$o2p->getCount()}, нужно зарезервировать еще $neededCount, но в наличии только {$product->getCount()}");
			}
		}
	}


	
	/**
	 * Логгирует какие поля в orders были изменены.
	 * 
	 * @param OrdersRow $row
	 * @return void
	 */
	protected function _logChangedColumns($row)
	{
		$columns = array(
			'delivery_comment' => 'комментарий к заказу', 
			'operator_id' => 'оператор', 
			'executed_at' => 'дата доставки', 
			'delivery_time_id' => 'интервал доставки',
		);

		$changed = array();
		$filter = new Zend_Filter_Word_UnderscoreToCamelCase();
		foreach($columns as $param => $name) {
			$currentValue = $this->_getParam($param);
			$getter = 'get' . ucfirst($filter->filter($param));
			$rowValue = $row->$getter();
			if ($param == 'executed_at') {
				$currentValue = date('Y-m-d', strtotime($currentValue));
			}
			if ($row->$getter() != $currentValue) {
				$changed[] = $name;
			}
		}
		
		if ($changed) {
			$changed = implode(', ', $changed);
			$row->addLog('%s изменил поля ' . $changed);
		}
	}
	
}